/**
 * Copyright (C) 2011 GreenSoft S.A.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *        http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package ar.com.greensoft.jeecommons.web;

import java.util.List;

import javax.faces.convert.Converter;


/**
 * <h3>Create-Read-Update-Delete (CRUD).</h3>
 * <p>CRUD para el controlardor de entidades del Tipo <code>T</code>.</p>
 * <p>Los Beans que implementen esta intefaces adminitran el ciclo de vida de la entidad.</p>
 * 
 * @author Jorge E. Villaverde
 * @since 1.0
 */
public interface CrudFacade<T> {
	/*
	 * View Methods  
	 */
	/**
	 * Muestra la página para crear una entidad del tipo <code>T</code>.
	 * @return url a la página para crear una Entidad
	 */
	String showCreate();
	
	/**
	 * Muestra la página para mostrar una entidad del tipo <code>T</code>.
	 * @return url a la página para mostrar una Entidad
	 */
	String showRead();
	
	/**
	 * Muestra la página para borrar una entidad del tipo <code>T</code>.
	 * @return url a la página para borrar una Entidad
	 */
	String showDelete();
	
	/**
	 * Muestra la página para editar una entidad del tipo <code>T</code>.
	 * @return url a la página para editar una Entidad
	 */
	String showUpdate();
	
	/**
	 * Muestra la página para buscar entidades del tipo <code>T</code>.
	 * @return url a la página para buscar este tipo de entidades.
	 */
	String showSearch();
	
	/**
	 * Utilice este método para saber si se está editando a la entidad.
	 * @return <code>true</code> si se está editando la entidad del tipo <code>T</code>
	 */
	boolean isEditing();
	
	/**
	 * Estable la url a la cuál redireccionar si el usuario cancela la operación.
	 * @param cancelView url a la que redireccionará el Bean si se cancela la operación.
	 */
	void   setCancelView(String cancelView);
	
	/**
	 * Utilice este método para obtener la url a la cual se redireccionará si el usuario
	 * cancel la operación.
	 * @return url a la que redireccionará el Bean si se cancela la operación.
	 */
	String getCancelView();
	
	/**
	 * Estable la url a la cuál redireccionar si el usuario acepta la operación.
	 * @param persistReturnView url a la que redireccionará el Bean si se acepta la operación.
	 */
	void   setPersistReturnView(String persistReturnView);
	
	/**
	 * Utilice este método para obtener la url a la cual se redireccionará si el usuario
	 * acepta la operación.
	 * @return url a la que redireccionará el Bean si se acepta la operación.
	 */
	String getPersistReturnView();
	
	/**
	 * Conversor de la Entidad del Tipo <code>T</code> a utilizar por la Vista.
	 * @return {@link Converter} de la Entidad del Tipo <code>T</code>
	 */
	Converter getConverter();
	/*
	 * End View Methods  
	 */
	
	/*
	 * Model Methods
	 */
	
	/**
	 * Devuelve la Entidad del Tipo <code>T</code> que posee en Bean.
	 * @return Entidad del Tipo <code>T</code> en el Bean. <code>null</code> si no posee entidad actualmente.
	 */
	T getEntity();

	/**
	 * Devuelve la lista de todas las entidades del tipo <code>T</code>.
	 * @return Lista de todas las Entidades
	 */
	List<T> getAllEntities();
	
	/**
	 * Create a new Entity
	 */
	void create();
	
	/**
	 * Periste la entidad, ya sea creando una nueva o actualizando la existente, 
	 * dependiendo de {@link #isEditing()}.
	 * @return Vista de Peristencia {@link #getPersistReturnView()}.
	 */
	String persist();
	
	/**
	 * Cancela la operación actual y devuelve la vista de cancelar.
	 * @return cancel view en {@link #getCancelView()}
	 */
	String cancel();
	
	/**
	 * Elimina la Entidad actual y devuelve una vista.
	 */
	String delete();
	
	/**
	 * Actualiza la Entidad actual.
	 */
	void refresh();
	
	
}